package com.neusoft.elm.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 数据库连接工具类 - Maven版本
 * 使用配置文件管理数据库连接参数
 */
public class DBUtil {
 private static final ThreadLocal<Connection> TL = new ThreadLocal<>();

 // 从配置文件读取数据库连接参数
 private static final String URL = PropertiesUtil.getProperty("db.url");
 private static final String DRIVER = PropertiesUtil.getProperty("db.driver");
 private static final String USERNAME = PropertiesUtil.getProperty("db.username");
 private static final String PASSWORD = PropertiesUtil.getProperty("db.password");
 // 获取Connection
 public static Connection getConnection() {
 Connection con = null;
 con = TL.get();
 if (con==null) {
 con = createConnection();TL.set(con);
 }
 return con;
 }
 // 开启一个事务
 public static void beginTransaction() throws Exception {
 Connection con = null;
 con = TL.get();
 if (con == null) {
 con = createConnection();
 TL.set(con);
 }
 con.setAutoCommit(false);
 }
 // 提交一个事务
 public static void commitTransaction() throws Exception {
 Connection con = TL.get();
 con.commit();
 }
 // 回滚一个事务
 public static void rollbackTransaction() throws Exception {
 Connection con = TL.get();
 con.rollback();
 }
 // 关闭各种资源
 public static void close(ResultSet rs, PreparedStatement pst) {
 try {
 if (rs != null) {
 rs.close();
 }
 if (pst != null) {
 pst.close();
 }
 } catch (SQLException e) {
 e.printStackTrace();
 }
 }
 // 关闭各种资源
 public static void close(PreparedStatement pst) {
 try {
 if (pst != null) {
 pst.close();
 }
 } catch (SQLException e) {
 e.printStackTrace();
 }
 }
 
 // 关闭各种资源
 public static void close() {
 Connection con = TL.get();
 try {
 if (con != null) {
 con.close();
 }
 //至关重要，否则容易造成内存溢出等问题。
 TL.remove();
 } catch (SQLException e) {
 e.printStackTrace();
 }
 }
 
 // 关闭所有资源（ResultSet、PreparedStatement和Connection）
 public static void closeAll(ResultSet rs, PreparedStatement pst) {
 try {
 if (rs != null) {
 rs.close();
 }
 if (pst != null) {
 pst.close();
 }
 } catch (SQLException e) {
 e.printStackTrace();
 }
 // 关闭Connection
 close();
 }
 
 // 关闭所有资源（PreparedStatement和Connection）
 public static void closeAll(PreparedStatement pst) {
 try {
 if (pst != null) {
 pst.close();
 }
 } catch (SQLException e) {
 e.printStackTrace();
 }
 // 关闭Connection
 close();
 }
 
 // 关闭所有资源（仅Connection）
 public static void closeAll() {
 close();
 }
 private static Connection createConnection() {
 Connection con = null;
 if (con == null) {
 try {
 Class.forName(DRIVER);
 con = DriverManager.getConnection(URL, USERNAME, PASSWORD);
 } catch (Exception e) {
 e.printStackTrace();
 }
 }
 return con;
 }
}